
// 文件名为mod名，在main.rs中use之后，就可以访问其中的pub函数了。
// rust的访问控制还是非常严格的。C/C++默认是都可以访问的，要显式声明为static。
pub fn entry() {
    println!("\n");
    println!("#### We are at func mod! ###");

    // 尝试给它赋值。行得通。
    let a = func_def();
    println!("a={:?}", a);

    // 给个返回值的类型，让它告警，看下返回值到底是什么类型。
    // 通过书中ch03-03最后的说明，它是一个空的tuple。
    // let b : i32 = func_def();
    //

    // statement和expression示例
    state_demo();

    // 多返回值，按照tuple的格式对应。
    let (x, y) = (1, 2);
    let (_a, _b) = m_func(x, y);

    println!("a={}, b={}", _a, _b);

    // 传递引用
    ref_func(&x);
}

fn ref_func(x: &i32) {
    println!("x={}", x);
}

fn m_func(x : i32, y : i32) -> (i32, i32) {
    // 也可以这样，不用return，不加分号。感觉是学的Perl。
    // (x+1, y+2)
    return (x+1, y+2);
}

// rust不需要所谓的前置声明，只要编译器能找到定义就可以了。
fn func_def() {
    println!("I'm a func do nothing.");
}

fn state_demo() {
    // {}中最后一个是expression，就可以拿到返回值。
    let a = { 2 + 1};
    println!("a={}", a);
    let b = { 
        let a = 100;
        a + 1
    };
    println!("b={}", b);

    // 将出错，因为最终返回的空tuple和指定的类型不匹配。
    /*
    let c : i32 = { 
        let a = 100;
        a + 1;
    };
    */
}
